package ar.uba.fi.posgrado.economy.service;

import java.util.List;

import ar.uba.fi.posgrado.common.dao.NoSuchEntityException;
import ar.uba.fi.posgrado.common.exception.MissingArgumentException;
import ar.uba.fi.posgrado.common.exception.PosgradoException;
import ar.uba.fi.posgrado.common.exception.PosgradoRuntimeException;
import ar.uba.fi.posgrado.common.exception.RepeatedInstanceException;
import ar.uba.fi.posgrado.common.exception.RepeatedNameException;
import ar.uba.fi.posgrado.common.service.GenericService;
import ar.uba.fi.posgrado.economy.model.Customer;

/**
 * Servicios relacionados con el {@link Customer Cliente}
 * 
 * @author pablo.tortorella
 * 
 */
public interface CustomerService extends GenericService<Customer> {

	/**
	 * Devuelve un cliente a partir de su razon social
	 * 
	 * @param corporateName
	 * @return cliente con la razon social que pasan como parametro
	 * @throws PosgradoRuntimeException
	 * @throws PosgradoException
	 */
	public abstract Customer getByCorporateName(String corporateName)
			throws PosgradoRuntimeException, PosgradoException;

	/**
	 * Crea un cliente nuevo
	 * 
	 * @param customer
	 * @throws PosgradoRuntimeException
	 * @throws PosgradoException
	 * @throws RepeatedInstanceException
	 * @throws MissingArgumentException
	 */
	public abstract void create(Customer customer)
			throws PosgradoRuntimeException, PosgradoException,
			RepeatedInstanceException, MissingArgumentException;

	/**
	 * Modifica los datos del cliente que se pasa por parametro, si existe. En
	 * caso contrario, lanza una excepcion
	 * 
	 * @param customer
	 * @return
	 * @throws PosgradoRuntimeException
	 * @throws PosgradoException
	 * @throws NoSuchEntityException
	 * @throws RepeatedNameException
	 */
	public abstract Customer update(Customer customer)
			throws PosgradoRuntimeException, PosgradoException,
			NoSuchEntityException, RepeatedNameException;

	/**
	 * Busca por razon social.<br>
	 * Hace una busqueda NO exacta, o sea, con q matchee parte del String es
	 * suficiente.<br>
	 * 
	 * @param corporateName
	 * @return
	 * @throws PosgradoRuntimeException
	 * @throws PosgradoException
	 */
	public abstract List<Customer> getByMatchingCorporateName(String corporateName)
			throws PosgradoRuntimeException, PosgradoException;

}
